package com.handle.system.api.service;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.handle.common.core.dto.token.User;
import com.handle.common.core.result.JsonResult;
import com.handle.system.api.dto.SysMenuDto;
import com.handle.system.api.entity.SysMenu;
import com.handle.system.api.request.menu.MenuAddOrEditParam;
import com.handle.system.api.request.menu.MenuQueryParam;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 系统菜单表 服务类
 * </p>
 *
 * @author zhangqing
 * @since 2021-03-13
 */
public interface ISysMenuService extends IService<SysMenu> {

    /**
     * 根据用户ID查询菜单
     *
     * @param userDto 登录用户信息
     * @return 菜单列表
     */
    List<SysMenu> selectMenusByUser(User userDto);

    /**
     * 根据用户ID查询权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> selectPermsByUserId(Long userId);

    /**
     * 查询角色所有的菜单权限
     *
     * @param roleId 角色id
     * @return 菜单树
     */
    List<Long> findMenuByRoleId(Long roleId);

    /**
     * 查询所有菜单列表
     *
     * @return 所有菜单列表
     */
    List<Tree<String>> findAllMenu();

    /**
     * 查询所有菜单和按钮权限列表
     * @return 所有菜单和按钮权限列表
     */
    List<SysMenu> findMenuAndPermissionList();

    /**
     * 查询所有菜单和按钮权限列表
     * @param menuQueryParam 筛选条件参数
     * @return 所有菜单和按钮权限列表
     */
    List<SysMenu> findMenuList(MenuQueryParam menuQueryParam);

    /**
     * 添加菜单
     * @param menuAddOrEditParam 添加菜单入参
     * @return 添加菜单返回数据
     */
    int addMenu(MenuAddOrEditParam menuAddOrEditParam);

    /**
     * 编辑菜单
     * @param menuAddOrEditParam 编辑菜单入参
     * @return 编辑菜单返回数据
     */
    JsonResult editMenu(MenuAddOrEditParam menuAddOrEditParam);

    /**
     * menuId为空时,检查所有菜单列表中该菜单名称是否存在,
     * 不为空时检查排出该id菜单列表中是否存在该菜单名称
     * (为空Add操作,不为空 Edit操作)
     * @param menuName 菜单名称
     * @param menuId 菜单ID
     * @return 菜单名称是否存在 true: 菜单名存在 false: 菜单名不存在
     */
    Boolean checkMenuName(String menuName,String menuId);

    /**
     * menuId为空时,检查所有菜单列表中该菜单唯一键(key)是否存在,
     * 不为空时检查排除该id后,菜单列表中是否存在该菜单唯一键(key)
     * (为空Add操作,不为空 Edit操作)
     * @param menuKey 菜单唯一键
     * @param menuId 菜单ID
     * @return 菜单名称是否存在 true: 菜单名存在 false: 菜单名不存在
     */
    Boolean checkMenuKey(String menuKey,String menuId);

    int delMenu(Long menuId);

    JsonResult findMenuDetails(Long menuId);
}
